データベースのセットアップ
===================

スケルトンアプリケーションを作り、データベースの設計が終りました。 このセクションではブログデータベースを作成し、スケルトンアプリケーションの中でデータベースとの接続を確立します。 


データベースの作成
-----------------

データベースは SQLite を使うことにします。 Yii のデータベースサポートは [PDO](http://www.php.net/manual/en/book.pdo.php) の上に構築されているため、 アプリケーションコードを変更することなく、MySQL や PostgreSQL といった異なる DBMS を利用することができます。

ディレクトリ `/wwwroot/blog/protected/data` にデータベースファイル `blog.db` を作成します。
SQLite による要求として、ディレクトリとデータベースファイルの両方が Web サーバプロセスから書き込み可能である必要がある、ということに注意して下さい。
このデータベースの作成は、インストールされた Yii のブログデモから、データベースファイルをコピーしてくるだけで構いません。データベースファイルは `/wwwroot/yii/demos/blog/protected/data/blog.db` にあります。
または、`/wwwroot/yii/demos/blog/protected/data/schema.sqlite.sql` というファイルにある SQL 文を実行してデータベースを生成することも出来ます。

> Tip|ヒント: SQL 文の実行には、[SQLite 公式ウェブサイト](http://www.sqlite.org/download.html) にある `sqlite3` コマンドラインツールを利用できます。


データベース接続を確立する
--------------------------------

作ったスケルトンアプリケーションでブログデータベースを使うには、`/wwwroot/blog/protected/config/main.php` という PHP スクリプトに保存されている [アプリケーション初期構成](http://www.yiiframework.com/doc/guide/ja/basics.application#sec-2) を変更する必要があります。
このスクリプトは "名前-値" のペアで構成された連想配列を返します。これらの値は [アプリケーションインスタンス](http://www.yiiframework.com/doc/guide/ja/basics.application) の書き込み可能なプロパティを初期化するために使われます。

`db` コンポーネントを以下のように構成します。

~~~
[php]
return array(
	......
	'components'=>array(
		......
		'db'=>array(
			'connectionString'=>'sqlite:/wwwroot/blog/protected/data/blog.db',
			'tablePrefix'=>'tbl_',
		),
	),
	......
);
~~~

上記の設定は、このアプリケーションが `db` [アプリケーションコンポーネント](http://www.yiiframework.com/doc/guide/ja/basics.application#sec-4) を持っており、その `connectionString` プロパティが `sqlite:/wwwroot/blog/protected/data/blog.db` として初期化されるべきこと、および、`tablePrefix` プロパティが `tbl_` であるべきことを示しています。

この設定によって、アプリケーションのコードのどこからでも `Yii::app()->db` を通じて DB 接続オブジェクトにアクセスすることができます。
`Yii::app()` は、エントリスクリプトで作成されたアプリケーションインスタンスを返すことに注意して下さい。
DB 接続が持つことができるメソッドやプロパティに興味があれば、[クラスリファレンス|CDbConnection] を参照して下さい。
しかし、多くの場合、この DB 接続を直接に利用することはありません。
その代りに、いわゆる [アクティブレコード](http://www.yiiframework.com/doc/guide/ja/database.ar) を使ってデータベースにアクセスします。

構成ファイルで設定した `tablePrefix` プロパティについて、もう少し説明したいと思います。
これはデータベーステーブル名のプレフィクスとして `tbl_` を使用していることを `db` 接続オブジェクトに伝えます。
具体的には、もし SQL 文の中に二重波括弧で囲まれたトークンがある場合(例えば `{{post}}`)、`db` 接続は
それをテーブルプレフィクスを付けた名前(例えば `tbl_post`)に変換してから、DBMS に送信して実行させます。
この機能は、将来テーブルプレフィクスを変更する必要が生じた場合でもソースコードを触る必要がない、という点で非常に有用です。
例えば、汎用のコンテンツ管理システム(CMS)を開発する場合、この機能を利用すると、CMS を新しい環境にインストールするときに
ユーザがテーブルプレフィクスを自由に選択できるようにすることが出来ます。

> Tip|ヒント: もし SQLite ではなく MySQL をデータの格納に使いたい場合には、
> `/wwwroot/yii/demos/blog/protected/data/schema.mysql.sql` の SQL 文を使用して、`blog` という名前の MySQL データベースを作成することが出来ます。
> そして、アプリケーション初期構成ファイルを以下のように修正します。
>
> ~~~
> [php]
> return array(
>     ......
>     'components'=>array(
>         ......
>         'db'=>array(
>             'connectionString' => 'mysql:host=localhost;dbname=blog',
>             'emulatePrepare' => true,
>             'username' => 'root',
>             'password' => '',
>             'charset' => 'utf8',
>             'tablePrefix' => 'tbl_',
>         ),
>     ),
>       ......
> );
> ~~~


<div class="revision">$Id$</div>
